package cn.stylefeng.guns.modular.business.util;

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description: 自定义校验规则
 * @Author jzy
 * @Date 2021/2/1 0001
 **/
public class ValidateUtil {

    /**
     * 检验VIN格式
     * @param vin
     * @return
     */
    public static boolean checkVIN(String vin) {
        Map<Integer, Integer> vinMapWeighting;
        Map<Character, Integer> vinMapValue;
        vinMapWeighting = new HashMap<>();
        vinMapValue = new HashMap<>();
        vinMapWeighting.put(1, 8);
        vinMapWeighting.put(2, 7);
        vinMapWeighting.put(3, 6);
        vinMapWeighting.put(4, 5);
        vinMapWeighting.put(5, 4);
        vinMapWeighting.put(6, 3);
        vinMapWeighting.put(7, 2);
        vinMapWeighting.put(8, 10);
        vinMapWeighting.put(9, 0);
        vinMapWeighting.put(10, 9);
        vinMapWeighting.put(11, 8);
        vinMapWeighting.put(12, 7);
        vinMapWeighting.put(13, 6);
        vinMapWeighting.put(14, 5);
        vinMapWeighting.put(15, 4);
        vinMapWeighting.put(16, 3);
        vinMapWeighting.put(17, 2);

        vinMapValue.put('0', 0);
        vinMapValue.put('1', 1);
        vinMapValue.put('2', 2);
        vinMapValue.put('3', 3);
        vinMapValue.put('4', 4);
        vinMapValue.put('5', 5);
        vinMapValue.put('6', 6);
        vinMapValue.put('7', 7);
        vinMapValue.put('8', 8);
        vinMapValue.put('9', 9);
        vinMapValue.put('A', 1);
        vinMapValue.put('B', 2);
        vinMapValue.put('C', 3);
        vinMapValue.put('D', 4);
        vinMapValue.put('E', 5);
        vinMapValue.put('F', 6);
        vinMapValue.put('G', 7);
        vinMapValue.put('H', 8);
        vinMapValue.put('J', 1);
        vinMapValue.put('K', 2);
        vinMapValue.put('M', 4);
        vinMapValue.put('L', 3);
        vinMapValue.put('N', 5);
        vinMapValue.put('P', 7);
        vinMapValue.put('R', 9);
        vinMapValue.put('S', 2);
        vinMapValue.put('T', 3);
        vinMapValue.put('U', 4);
        vinMapValue.put('V', 5);
        vinMapValue.put('W', 6);
        vinMapValue.put('X', 7);
        vinMapValue.put('Y', 8);
        vinMapValue.put('Z', 9);
        boolean resultFlag = false;
        String upperVin = vin.toUpperCase();
        //排除字母O、I、Q
        if (StringUtils.isNotBlank(vin) && !upperVin.contains("O") && !upperVin.contains("I") && !upperVin.contains("Q")) {
            //1:长度为17
            if (vin.length() == 17) {
                char[] vinArr = upperVin.toCharArray();
                int amount = 0;
                for (int i = 0; i < vinArr.length; i++) {
                    //VIN码从从第一位开始，码数字的对应值×该位的加权值，计算全部17位的乘积值相加
                    amount += vinMapValue.get(vinArr[i])*vinMapWeighting.get(i + 1);
                }
                //乘积值相加除以11、若余数为10，即为字母Ｘ
                if (amount % 11 == 10) {
                    resultFlag = vinArr[8] == 'X';
                } else {
                    // VIN码从从第一位开始，码数字的对应值×该位的加权值，
                    // 计算全部17位的乘积值相加除以11，所得的余数，即为第九位校验值
                    resultFlag = amount % 11 == vinMapValue.get(vinArr[8]);
                }
            }
        }
        return resultFlag;
    }
}
